package br.com.sjdr.projeto.item;

import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JOptionPane;

import br.com.sjdr.projeto.inicio.Console;
import br.com.sjdr.projeto.inicio.Util;
import br.com.sjdr.projeto.menu.MenuLoogin;
import br.com.sjdr.projeto.persistencia.PersistirCliente;
import br.com.sjdr.projeto.persistencia.PersistirHistorico;
import br.com.sjdr.projeto.persistencia.Persistir_Estoque;
import br.com.sjdr.projeto.pessoa.Cliente;

/**
 * Classe referente aos pedidos. Nela s�o guardadas informa��es em atributos
 * como o n�mero do pedido e o nome do cliente. Possui m�todos que podem buscar
 * pedidos em aberto do cliente, fazer novo pedido, buscar um cliente apartir de
 * um pedido, excluir pedidos e itens, etc.
 */
@SuppressWarnings("serial")
public class Pedido implements Serializable {


	

	public static JFrame FraTab;


	static SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm");
	public static DecimalFormat f = new DecimalFormat("0.00");
	private int nPedido;
	private String cliente;

	public ArrayList<Item> getVec() {
		return vec;
	}

	public void setVec(ArrayList<Item> vec) {
		this.vec = vec;
	}

	public ArrayList<Item> vec = new ArrayList<Item>();
	private double total;
	private String data;

	public int getnPedido() {
		return nPedido;
	}

	public void setnPedido(int nPedido) {
		this.nPedido = nPedido;
	}

	public String getCliente() {
		return cliente;
	}

	public void setCliente(String cliente) {
		this.cliente = cliente;
	}

	public double getTotal() {
		return total;
	}

	public void setTotal(double total) {
		this.total = total;
	}

	public void setData(String data) {
		this.data = data;
	}

	public String getData() {
		return data;
	}

	/**
	 * M�todo respons�vel por exibir um menu aos pedidos onde pode-se efetuar um
	 * novo pedido e consultar pedidos em aberto.
	 */
	public static void menuPedido() {

		int valor;
		Pedido c = new Pedido();
		do {
			System.out.println("|---------------------------------------|\n");
			System.out.println("|            SJDR CONFECCOES            |\n");
			System.out.println("|------------ MENU PEDIDO --------------|\n");
			System.out.println("|1 - Efetuar um novo pedido             |\n");
			System.out.println("|2 - Consultar pedido em aberto         |\n");
			System.out.println("|3 - Voltar ao menu principal           |\n");
			System.out.println("|---------------------------------------|\n\n");
			System.out
			.println("Digite o numero corresponde a operacao desejada:\n");

			valor = Console.readInteger();
			switch (valor) {
			case 1:
				novoPedido(c);
				break;
			case 2:
				c = pedidoemAberto();
				if (c != null) {
					criandoPedido(c);
				}
				break;
			case 3:
				MenuLoogin.menuAdm();
				break;
			default:
				System.out.println("Valor incompativel. Digite novamente.");
			}
		} while (valor != 3);
	}

	/**
	 * M�todo respons�vel por exibir pedidos de um cliente titular. O usu�rio
	 * digitar� o nome do cliente titular e ser�o exibidos os pedidos em aberto
	 * deste cliente.
	 * 
	 * @return
	 */
	public static Pedido pedidoemAberto() {

		System.out.println("|---------------------------------------|\n");
		System.out.println("|            SJDR CONFECCOES            |\n");
		System.out.println("|--------  Recupera��o de pedidos  -----|\n");
		System.out.println("|---------------------------------------|\n");
		System.out.println("Digite o nome do Cliente titular do pedido");
		String x = Console.readString();

		for (int i = 0; i < PersistirHistorico.pedidosPendentes.size(); i++) {
			if (PersistirHistorico.pedidosPendentes.get(i).getCliente()
					.equalsIgnoreCase(x)) {
				return PersistirHistorico.pedidosPendentes.get(i);

			}
		}
		System.out.println("Pedido n�o encontrado");
		return null;
	}

	/**
	 * M�todo que pede um nome de um cliente para ser criado um novo pedido
	 * relacionado a este cliente. Se este cliente existir no vetor clientelist,
	 * ser� criado um novo pedido apartir do m�todo criandoPedido(c).
	 * 
	 * @param c
	 */
	public static void novoPedido(Pedido c) {

		System.out.println("|---------------------------------------|\n");
		System.out.println("|            SJDR CONFECCOES            |\n");
		System.out.println("|-------------- Validacao --------------|\n");
		System.out.println("|---------------------------------------|\n");
		System.out.println("Digite o Nome do cliente:");
		c.setCliente(Console.readString());
		int x = buscarCliente(c);
		if (x == 1) {
			criandoPedido(c);
		}
		if (x == 0) {
			MenuLoogin.menuAdm();
		}
	}

	/**
	 * M�todo que recebe como par�metro um pedido e busca o cliente referente a
	 * ele. Se o cliente existir com este pedido, � exibido seus dados na tela:
	 * Nome, Endere�o, Telefone e CPF. Sen�o exibir� uma mensagem de erro
	 * informando que o cliente n�o existe.
	 * 
	 * @param c
	 * @return
	 */
	private static int buscarCliente(Pedido c) {
		String y = c.getCliente();
		int elemento = 0;
		if (Cliente.verificaExistBool(y) == true) {
			elemento = Cliente.verificaExistInt(y);
			System.out.println("\n   --------- Cliente ---------"); // imprime
			// dados
			// pessoa
			System.out.println("\nNome :     "
					+ PersistirCliente.clientelist.get(elemento).getNome());
			System.out.println("\nEndereco : "
					+ PersistirCliente.clientelist.get(elemento).getEndereco());
			System.out.println("\nTelefone : "
					+ PersistirCliente.clientelist.get(elemento).getTelefone());
			System.out.println("\nCPF :   "
					+ PersistirCliente.clientelist.get(elemento).getCPF());
			return 1;
		} else {
			System.out
			.println("Cliente nao esta cadastrado. Por favor cadastre no menu principal.");
		}
		Util.waitEnter();
		return elemento;
	}

	/**
	 * M�todo que recebe como par�metro um pedido a ser criado. Exibe um menu
	 * onde pode-se inserir itens, fechar pedidos, salvar pedidos e excluir
	 * pedido.
	 * 
	 * @param c
	 */
	public static void criandoPedido(Pedido c) {
		Pedido p = new Pedido();
		p = c;
		p.data = sdf.format(new Date());
		for (int x;;) {
			System.out
			.println("\n\n|---------------------------------------|\n");
			System.out.println("|           Seja Bem Vindo (a)          |\n");
			System.out.println("|  Sr(a) " + p.getCliente() + "\n");
			System.out.println("|---------------------------------------|\n");

			imrpimirListaCompras(p);
			System.out.println("\n\n Escolha uam das opcoes abaixo\n");
			System.out.println("\n|1 - Inserir um item                    |\n");
			System.out.println("|2 - Excluir Item                       |\n");
			System.out.println("|3 - Fechar o pedido                    |\n");
			System.out.println("|4 - Salvar o pedido e sair             |\n");
			System.out.println("|5 - Excluir o pedido e retornar        |\n");
			x = Console.readInteger();
			if (x == 1) {
				insereItem(p);
			}
			if (x == 2) {
				excluirItem(p);
			}
			if (x == 3) {
				validcaoPedido(p);

			}
			if (x == 4) {
				PersistirHistorico.pedidosPendentes.add(p);
				MenuLoogin.menuAdm();
			}
			if (x == 5) {
				PersistirHistorico.removePendentes(p);
				MenuLoogin.menuAdm();
			}
		}

	}

	/**
	 * M�todo para valida��o de pedidos. Recebe um pedido como par�metro e
	 * verifica se existe no estoque. Ao final, salva os pedidos utilizando os
	 * m�todos de persist�ncia salvaPedidosFinalizados(p) e removePendentes(p).
	 * 
	 * @param p
	 */
	public static void validcaoPedido(Pedido p) {
	
		if (p.total == 0) {
			//Pedido.imrpimirListaCompras(p);
			JOptionPane.showMessageDialog(null,
			"Erro 1 ao fechar o pedido....\n\n Erro na soma total...\n\ntente novamente mais tarde.. ");
		} else {
			for (int i = 0; i < p.vec.size(); i++) {
				int j = procura(p.vec.get(i));
				if (j == 1) {
					JOptionPane.showMessageDialog(null,
					"Erro 2 ao fechar o pedido....\n\n Itens Indiponiveis em estoque...\n\ntente novamente mais tarde.. ");
					return;
				}
			}

			baixaEmEstoque(p);
			PersistirHistorico.salvaPedidosFinalizados(p);
			PersistirHistorico.removePendentes(p);
			JOptionPane.showMessageDialog(null,
			"Pedido finalizado com êxito.. \n\n Obrigado pela compra");
			return;
		}
		
	}

	private static void baixaEmEstoque(Pedido p) {
		for (int i = 0; i < p.vec.size(); i++) {
			baixa(p.vec.get(i));
		}
	}

	private static void baixa(Item item) {
		for (int i = 0; i < Persistir_Estoque.estoquelist.size(); i++) {
			if (Persistir_Estoque.estoquelist.get(i).getNomeItem()
					.equalsIgnoreCase(item.getNomeItem())) {
				int x = Persistir_Estoque.estoquelist.get(i).getQuantidade()
				- item.getQuantidadeporcliente();
				Persistir_Estoque.estoquelist.get(i).setQuantidade(x);

			}
		}
	}

	/**
	 * M�todo respons�vel por buscar um item no vetor estoquelist.
	 * 
	 * @param item
	 * @return
	 */
	private static int procura(Item item) {
		for (int i = 0; i < Persistir_Estoque.estoquelist.size(); i++) {
			if (Persistir_Estoque.estoquelist.get(i).getNomeItem()
					.equalsIgnoreCase(item.getNomeItem())) {
				if (item.getQuantidadeporcliente() > Persistir_Estoque.estoquelist
						.get(i).getQuantidade()) {
					return 1;
				}
			}
		}
		return 0;
	}

	/**
	 * M�todo que exibe um menu para exclus�o de itens no pedido buscando por
	 * nome e por c�digo. Utiliza m�todos de exclus�o excluiItemNome(p) e
	 * excluiItemCodigo(p).
	 * 
	 * @param p
	 */
	private static void excluirItem(Pedido p) {
		@SuppressWarnings("unused")
		Item it = new Item();
		System.out.println("\n\n|---------------------------------------|\n");
		System.out.println("|           Seja Bem Vindo (a)          |\n");
		System.out.println("|  Sr(a) " + p.getCliente() + "\n");
		System.out.println("|\n-- Excluindo itens no pedido  ---------|\n");
		System.out.println("|-----------------------------------------|\n");
		System.out.println("|-----------------------------------------|\n");
		System.out.println("|1 - Busca Por nome                       |\n");
		System.out.println("|2 - Busca por codigo                     |\n");
		System.out.println("|3 - Menu anteriror                       |\n");
		int x = Console.readInteger();
		if (x == 1) {
			int y = excluiItemNome(p);
			if (y == 1) {
				System.out.println("Item excluido com sucesso");
			} else {
				System.out.println("O item nao foi excluido ERROR");
			}
		}
		if (x == 2) {
			int y = exluiItemCodigo(p);
			if (y == 1) {
				System.out.println("Item excluido com sucesso");
			} else {
				System.out.println("O item nao foi excluido ERROR");
			}
		}
		if (x == 3) {
			return;
		}

	}

	/**
	 * M�todo que recebe como par�metro um pedido e pede o c�digo do �tem a ser
	 * excluido. Caso encontre o item, ele � removido do vetor vec.
	 * 
	 * @param p
	 * @return
	 */
	private static int exluiItemCodigo(Pedido p) {
		System.out.println("Digite o codigo do item que voc� quer excluir");
		int x = Console.readInteger();

		for (int i = 0; i < p.vec.size(); i++) {
			if (p.vec.get(i).getCogigo() == x) {
				p.vec.remove(i);
				return 1;
			}
		}
		return 0;
	}

	/**
	 * M�todo que recebe como par�metro um pedido e pede o nome do �tem a ser
	 * excluido. Caso encontre o item, ele � removido do vetor vec.
	 * 
	 * @param p
	 * @return
	 */
	private static int excluiItemNome(Pedido p) {
		System.out.println("Digite o Nome do item que voc� quer excluir");
		String x = Console.readString();

		for (int i = 0; i < p.vec.size(); i++) {
			if (x.equals(p.vec.get(i).getNomeItem())) {
				p.vec.remove(i);
				return 1;
			}

		}
		return 0;
	}

	/**
	 * M�todo que exibe um menu para inser��o de itens no pedido. Utiliza os
	 * m�todos de busca buscaPorNome() e buscaPorCodigo() para encontrar o item
	 * a ser inserido em pedidos e ao final, caso exista, ele � inserido apartir
	 * do m�todo adicionaItemLista(p, it).
	 * 
	 * @param p
	 */
	private static void insereItem(Pedido p) {
		int x;
		Item it = new Item();
		System.out.println("\n\n|---------------------------------------|\n");
		System.out.println("|           Seja Bem Vindo (a)          |\n");
		System.out.println("|  Sr(a) " + p.getCliente() + "\n");
		System.out.println("|\n-- Inserindo itens no pedido  ---------|\n");
		System.out.println("|-----------------------------------------|\n");
		System.out.println("|-----------------------------------------|\n");
		System.out.println("|1 - Busca Por nome                       |\n");
		System.out.println("|2 - Busca por codigo                     |\n");
		System.out.println("|3 - Menu anterior                        |\n");
		x = Console.readInteger();
		if (x == 1) {
			it = Item.buscaPorNome();
		}

		if (x == 2) {
			it = Item.buscaPorCodigo();
		}
		if (x == 3) {
			return;
		}
		adicionaItemLista(p, it);

	}

	public static void adicionaItemLista(Pedido p, Item it) {
		/*
		 * System.out.println("Existem " + it.getQuantidade() + " unidades de "
		 * + it.getNomeItem() + " em estoque");
		 * System.out.println("Digite quantas voc� quer comprar");
		 */
		int y;
		try {
			y = Integer.parseInt(JOptionPane.showInputDialog(
					"Existem " + it.getQuantidade() + " unidades de "
					+ it.getNomeItem()
					+ " em estoque\n\n Quantos que comprar", ""));
		} catch (Exception e) {
			JOptionPane
			.showMessageDialog(
					null,
					"Voc� deve digitar um tipo Valido\n\n N�o foram inseridos itens no seu pedido\n\n");
			y = 0;
			return;
		}

		if (y <= it.getQuantidade()) {

			it.setQuantidadeporcliente(y);
			it.setPrecoAcumulado(((it.getPrecoFinal() * y) + p.total));
			p.vec.add(it);
			
		} else {
			JOptionPane
			.showMessageDialog(null,
					"Numero Insuficiente de mercadorias em estoque\n\n Tente novamente mais tarde");

		}

	}

	/**
	 * M�todo respons�vel por exibir uma lista de compras do pedido feito. Nele
	 * s�o exibidos o nome do item, pre�o, quantidade e o valor total da compra.
	 * 
	 * @param p
	 */

	public static void imrpimirListaCompras(Pedido p) {

		/*Rotulo = new JLabel("Tabela de Itens em estoque:");
		String[] cols = { "C�digo", "Descri��o", "Quantidade", "Pre�o" };
		DListaNomes = new DefaultTableModel(cols, 0);
		ListaNomes = new JTable(DListaNomes);

		JSRola = new JScrollPane(
				ListaNomes, // aqui voc� est� definindo que a viewport do
				// ScrollPane � a JTable
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

		p.setTotal(0);
		double x = 0;
		System.out.println("      Sua lista de compras possui      \n"
				+ "        o(s) seguinte(s) iten(S)          ");
		if (p.vec.isEmpty()) {
			JOptionPane.showMessageDialog(null,
			"O seu carrinho de compras esta vazio\n\n");
			return;
		}
		int j = 0;
		for (int i = 0; i < p.vec.size(); j++, i++) {

			String descricao;
			int codigo, quantidade;
			String preco;
			descricao = p.vec.get(i).getNomeItem();
			codigo = p.vec.get(i).getCogigo();
			quantidade = p.vec.get(i).getQuantidadeporcliente();
			preco = Pedido.f.format(p.vec.get(i).getPrecoFinal());
			System.out.println("\n");
			String[] row1 = { String.valueOf(codigo), descricao,
					String.valueOf(quantidade), preco };
			DListaNomes.insertRow(i, row1);
			x = (x + (p.vec.get(i).getPrecoFinal() * p.vec.get(i)
					.getQuantidadeporcliente()));
			p.setTotal(x);*/
			/*
			 * System.out.println("\n nome do item    --> " +
			 * p.vec.get(i).getNomeItem());
			 * System.out.println(" Preco do Item   --> " +
			 * f.format(p.vec.get(i).getPrecoFinal()));
			 * System.out.println(" Quantidade     --> " +
			 * p.vec.get(i).getQuantidadeporcliente());
			 */
	//	}
		/*
		 * p.setTotal(x); System.out.println("\nO valor de sua compra est� em: "
		 * + f.format(p.getTotal()));
		 */
		/*String[] row1 = { "Valor total:", "", "", String.valueOf(x) };
		DListaNomes.insertRow(j, row1);

		Painel = new JPanel(new BorderLayout());
		FraTab = new JFrame("Carrinho de Compras Cliente " + p.getCliente()
				+ " Data " + p.getData());
		Painel.add(BorderLayout.NORTH, Rotulo);
		Painel.add(BorderLayout.CENTER, JSRola);
		FraTab.add(BorderLayout.CENTER, Painel);
		FraTab.setLocation(432, 168);
		FraTab.pack();

		FraTab.setVisible(true);*/
	}

	public static void exluiItemCodigo(Pedido p, int j) {

		for (int i = 0; i < p.vec.size(); i++) {
			if (p.vec.get(i).getCogigo() == j) {
				p.vec.remove(i);
				JOptionPane.showMessageDialog(null,
				"Item excluido com sucesso!!");
				return;

			}

		}

		JOptionPane.showMessageDialog(null,
		"Item n�o excluido, o codigo deve estar errado!!");

	}

	public static Pedido pedidosPendentes(String nome) {
	
		for (int i = 0; i < PersistirHistorico.pedidosPendentes.size(); i++) {
			if (PersistirHistorico.pedidosPendentes.get(i).getCliente()
					.equalsIgnoreCase(nome)) {
				return PersistirHistorico.pedidosPendentes.get(i);

			}
		}
		JOptionPane.showMessageDialog(null,
		"Pedido N�o encontrado....\n\n");
	
		return null;
	}
}
